import asyncio
import logging
from aiogram import Bot, Dispatcher
from os import getenv
from sys import exit

from dotenv import load_dotenv

from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.types import BotCommand

from handlers.answers import register_handlers_answer
from handlers.common import register_handlers_common

from utils.db_api.db_gino import on_startup, db

#
# bot_token = getenv("BOT_TOKEN")
# if not bot_token:
#     exit("Error: no token provided")
#
# bot = Bot(token=)
#
# # Диспетчер для бота
# dp = Dispatcher(bot)
# # Включаем логирование, чтобы не пропустить важные сообщения
# logging.basicConfig(level=logging.INFO)
#
#
# # Хэндлер на команду /start
# @dp.message_handler(commands="start")
# async def cmd_start(message: types.Message):
#     keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
#     buttons = ["Пройти опрос", "Подписаться на рассылку предложений по лечению"]
#     keyboard.add(*buttons)
#     await message.answer("Выберите действие",reply_markup=keyboard)
#
#
# if __name__ == "__main__":
#     # Запуск бота
#     executor.start_polling(dp, skip_updates=True)


# Не забудьте про импорты

logger = logging.getLogger(__name__)


# Регистрация команд, отображаемых в интерфейсе Telegram
async def set_commands(bot: Bot):
    commands = [
        BotCommand(command="/start", description="Пройти тестирование"),
        BotCommand(command="/cancel", description="Отменить текущее действие")
    ]
    await bot.set_my_commands(commands)


async def main():
    load_dotenv()
    # Настройка логирования в stdout
    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
    )
    logger.error("Starting bot")

    # Парсинг файла конфигурации

    # Объявление и инициализация объектов бота и диспетчера
    bot_token = getenv("TOKEN")
    if not bot_token:
        exit("Error: no token provided")

    bot = Bot(token=bot_token)

    dp = Dispatcher(bot, storage=MemoryStorage())

    # Регистрация хэндлеров
    register_handlers_common(dp)
    register_handlers_answer(dp)

    print('Подключение к PostgreSQL')

    await on_startup(dp)

    # print('Удаление базы данных')
    #
    # await db.gino.drop_all()

    print('Создание таблиц')

    await db.gino.create_all()

    print('Готово')

    # Установка команд бота
    await set_commands(bot)

    # Запуск поллинга
    # await dp.skip_updates()  # пропуск накопившихся апдейтов (необязательно)
    await dp.start_polling()


if __name__ == '__main__':
    asyncio.run(main())
